<?php
namespace gnomephp\mvc;

use gnomephp\Configuration;
/**
 *
 * Notifier, Mailer
 * @author peec
 *
 */
abstract class Mailer extends Controller{
	
	private $content = '';

	/**
	 * 
	 * Message object.
	 * @var \Swift_Message
	 */
	private $message = null;

	public function __construct(){
		parent::__construct();

		// Load the swiftmailer library.
		require_once  GNOME_FW_PATH . DIRECTORY_SEPARATOR . 'libs' . DIRECTORY_SEPARATOR . 'swiftmailer' . DIRECTORY_SEPARATOR . 'swift_required.php';
		

		$this->message = $this->newMessage();

	}



	/**
	 * Creates a new message and deletes the current message.
	 * @return \Swift_Message
	 */
	protected function newMessage(){
		$this->message = \Swift_Message::newInstance();
		return $this->message; 
	}

	/**
	 * Gets the current message.
	 * @return \Swift_Message
	 */
	protected function message(){
		return $this->message;
	}

	/**
	 * Sends the email, returns the output of mail() function.
	 * @param string $viewFile The view file name where the mail is written in a view file.
	 * @return int The amount of messages sent.
	 * @throws \Swift_TransportException
	 */
	protected function send($viewFile=null){

		$mailSettings = Configuration::get('application', 'mail');

		// There are 3 transport routes available.
		switch($mailSettings['transport']){
			case 'smtp':

				$transport = \Swift_SmtpTransport::newInstance($mailSettings['smtp']['host'], $mailSettings['smtp']['port'], ($mailSettings['smtp']['encryption'] ? $mailSettings['smtp']['encryption'] : null));

				if($mailSettings['smtp']['username'])$transport->setUsername($mailSettings['smtp']['username']);
				if($mailSettings['smtp']['password'])$transport->setPassword($mailSettings['smtp']['password']);

				break;
			case 'mail':
				$transport = \Swift_MailTransport::newInstance();
				break;
			case 'sendmail':
				$transport = \Swift_SendmailTransport::newInstance($mailSettings['sendmail']['command']);
				break;
			default:
				throw new MailerException(sprintf("%s is not a transport route available for sending emails. You may select either: smtp, mail or sendmail.", $mailSettings['transport']));
		}

		$mailer = \Swift_Mailer::newInstance($transport);



		if ($viewFile !== null)$this->content = $this->view->render($viewFile, true);


		$mailer = \Swift_Mailer::newInstance($transport);

		//Create a message from view if not already set.
		if ($viewFile !== null)$this->message->setBody($this->content);

		//Send the message
		$result = $mailer->send($this->message);
		
		return $result;
	}



}